package com.bobo.jdk.bInterface;

/**
 * 接口新增默认方法、接口方法
 *
 * 1.默认方法对比：
 *      1）JDK8之前：interface 接口名{ 静态常量; 抽象方法; }
 *      2）JDK8：interface 接口名{ 静态常量; 抽象方法; 默认方法; 静态方法; }
 * 1.应用：扩展接口能力
 *      在接口添加默认方法：
 *      1）实现类可以直接调用默认方法；
 *      2）可以重写默认方法；
 *      3）实现类可以不理会新增的方法，无须implement；
 *
 * 2.静态方法对比：
 *      1）JDK8之前：静态方法无法调用接口方法
 *      2）JDK8：静态方法能够调用接口方法
 * 2.应用：扩展接口能力
 *      在接口添加默认方法：
 *      1）实现类可以直接调用默认方法；
 *      2）可以重写默认方法；
 *      3）实现类可以不理会新增的方法，无须implement；
 */
public class Demo01Interface {

    public static void main(String[] args) {
        A a = new B();
        a.test3();
        A c = new C();
        c.test3();
        A.test4();
    }
}

interface A{
    void test1();
    // 接口中新增抽象方法，所有实现类都需要重写这个方法，不利于接口的扩展
    void test2();

    /**
     * 接口中定义的默认方法
     * @return
     */
    public default String  test3(){
        System.out.println("接口中的默认方法执行了...");
        return "hello";
    }

    /**
     * 接口中的静态方法
     * @return
     */
    public static String test4(){
        System.out.println("接口中的静态方法....");
        return "Hello";
    }
}

class B implements  A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }

    @Override
    public String test3() {
        System.out.println("B 实现类中重写了默认方法...");
        return "ok ...";
    }

}

class C implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}
